const koa = require("koa");
const app = new koa();

// 1. 所有的中间件都的是一个async函数
// 2. 所有的next都得await
// 3. 所有的异步逻辑都的封装成promise 并且要await

//ctx: koa执行上下文   next:dispatch(1)
// next: dispatch函数; dispatch函数的this被指向了null ; dispatch函数的第一个参数已经被柯里化了!!值为1
app.use(async (ctx,next)=>{
    console.log(1)
    //dispatch(1) 返回一个promise 这个promise到底是什么状态 取决于下一个中间件函数的执行结果!
    await next()
    console.log(6)
})

//ctx: koa执行上下文   next:dispatch(2)
app.use(async (ctx,next)=>{
    console.log(2)
    await next()
    await new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log(5);
            resolve()
        },3000)
    })
})

//ctx: koa执行上下文   next:dispatch(3)
app.use(async (ctx,next)=>{
    console.log(3)
    await next()
    console.log(4)
})

app.listen(8888,"127.0.0.1",()=>{
    console.log("server is running on http://127.0.0.1:8888")
})